﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoBD;
using System.Data.SqlClient;
using CapaLogica.CL.UtilidadesGenerales;

namespace CapaLogica.CL.Aporte
{
    public class AportePersistente
    {

        private AcessoBD _acceso = new AcessoBD();

        public int insertarAporte(Cl_Aporte pAporte, int pIdtema)//parametros del grupo
        {
            int nuevoId = -1;

            Parametros[] parametros = new Parametros[3];
            String sql = @"Insert into dbo.T_Aporte(comentario, id_usuario, id_tema)
                                values(param1, param3, param2) ";

            parametros[0] = new Parametros(pAporte.Comentario, "param1");
            parametros[1] = new Parametros(pIdtema, "param2");
            parametros[2] = new Parametros(pAporte.IdUsuario, "param3");

            try
            {
                nuevoId = _acceso.executeSQLInsert(sql, parametros);

                //BITACORA
                Modulo.insertarBitacora(pAporte.IdUsuario, "Creación de un nuevo aporte", nuevoId, 9, 1);
                //---------------
                return nuevoId;
            }
            catch (Exception)
            {
                throw new Exception("Ha habido un error al registrar el aporte.");
            }
        }



        public Cl_Aporte buscarAporte(int pIdAporte)
        {
            string psp = @"select id_aporte, comentario, fecha_creacion, id_usuario,  nota,  modificado, fecha_modificacion
                        from dbo.T_Aporte
                        where id_aporte = param1";

            Cl_Aporte aporte = null;
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pIdAporte, "param1");
            AcessoBD acceso = new AcessoBD();
            DateTime fechaFin = DateTime.MinValue;
            int nota = 0;
            Boolean modificado = false;

            try
            {
                SqlDataReader reader = acceso.execute_Consulta(psp, parametros);

                if (reader.Read())
                {
                    if(!reader.IsDBNull(6))
                    {
                        fechaFin = reader.GetDateTime(6);
                    }

                    if (!reader.IsDBNull(4))
                    {
                        nota = reader.GetInt32(4);
                    }

                    if (!reader.IsDBNull(5))
                    {
                        modificado = reader.GetBoolean(5);
                    }

                    aporte = new Cl_Aporte(reader.GetInt32(0), reader.GetString(1),
                        reader.GetDateTime(2), reader.GetInt32(3), nota, 
                        modificado, fechaFin); 

                }

                reader.Close();
                return aporte;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        internal List<EsAporte> listarAportesDeTema(int pidTema)
        {
            List<EsAporte> aportes = new List<EsAporte>();
            DateTime fechaMod = DateTime.MinValue;

            EsAporte aporte;
            string psp = @"dbo.sp_listar_aportes_tema";

            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pidTema, "idTema");

            try
            {
                
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros);
                int nota = 0;

                while (reader.Read())
                {

                    if(!reader.IsDBNull(4)){
                        nota = reader.GetInt32(4);
                    }

                    if (!reader.IsDBNull(6))
                    {
                        fechaMod = reader.GetDateTime(6);

                        aporte = new EsAporte();
                        aporte.IdAporte = reader.GetValue(0) + "";
                        aporte.Comentario = reader.GetValue(1).ToString();
                        aporte.Fecha = reader.GetDateTime(2).ToString();
                        aporte.IdUsuario = reader.GetValue(3) + "";
                        aporte.Nota = nota + "";
                        aporte.Modificado = reader.GetBoolean(5);
                        aporte.FechaModificacion = fechaMod.ToString();
                        aporte.NombreUsuario = reader.GetValue(7).ToString();
                        aporte.NombreRol = reader.GetString(8);

                    }
                    else {

                        aporte = new EsAporte();
                        aporte.IdAporte = reader.GetValue(0) + "";
                        aporte.Comentario = reader.GetValue(1).ToString();
                        aporte.Fecha = reader.GetDateTime(2).ToString();
                        aporte.IdUsuario = reader.GetValue(3) + "";
                        aporte.NombreUsuario = reader.GetValue(7).ToString();
                        aporte.NombreRol = reader.GetString(8);
                        aporte.Nota = nota + "";
                        aporte.Modificado = false;
                        aporte.FechaModificacion = "";
                    }
                    aportes.Add(aporte);
                }
                reader.Close();

                return aportes;

            }
            catch (Exception ex)
            {
                throw new System.Exception(ex.Message);
            }

        }



        public void asignarCalificacionAporte(int pIdUsuario, Cl_Aporte pAporte)
        {
            String sql = @"update dbo.T_Aporte 
                        set nota = param1
                        where  id_aporte = param2";

            Parametros[] parametros = new Parametros[2];
            parametros[0] = new Parametros(pAporte.Nota, "param1");
            parametros[1] = new Parametros(pAporte.IdAporte, "param2");

            try
            {
                _acceso.executeSQL(sql, parametros);
                Modulo.insertarBitacora(pIdUsuario, "Asignación a la nota de un aporte.", pAporte.IdAporte, 9, 3);
            }
            catch (Exception ex )
            {
                
                throw ex;
            }
        }

        public void eliminarAporte(int pIdAporte, int pIdusuario)
        {
            try
            {
                String sql = @"delete  dbo.T_Aporte
					            where id_aporte = param1";

                Parametros[] parametros = new Parametros[1];
                parametros[0] = new Parametros(pIdAporte, "param1");

                _acceso.executeSQL(sql, parametros);

                Modulo.insertarBitacora(pIdusuario, "Eliminación de un aporte", pIdAporte, 9, 2);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        internal void modificarAporte(Cl_Aporte pAporte)
        {

            try
            {  
                Parametros[] parametros = new Parametros[4];

                string sql = @"update dbo.T_Aporte set comentario = param1, modificado = param2, fecha_modificacion = param3 where id_aporte = param0";

                parametros[0] = new Parametros(pAporte.IdAporte, "param0");
                parametros[1] = new Parametros(pAporte.Comentario, "param1");
                parametros[2] = new Parametros(pAporte.Modificado, "param2");
                parametros[3] = new Parametros(pAporte.FechaModificacion, "param3");


                _acceso.executeSQL(sql, parametros);

                Modulo.insertarBitacora(pAporte.IdUsuario, "Modificacion de un aporte", pAporte.IdAporte, 18, 3);

            }
            catch (Exception)
            {

                throw new Exception("Hubo un error al intentar modificar un aporte. El aporte no ha sido modificado.");
            }


        }
    }
}
